/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package entidade.controller.JSF;

import entidade.controller.JPA.FuncionarioJpaController;
import entidade.controller.JSF.util.PagingInfo;
import entidade.persistencia.Funcionario;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;
import javax.faces.FacesException;
import entidade.controller.JSF.util.JsfUtil;
import entidade.controller.JPA.exceptions.NonexistentEntityException;
import entidade.controller.JPA.exceptions.IllegalOrphanException;
import java.util.ArrayList;
import java.util.Calendar;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.model.SelectItem;

/**
 *
 * @author victorinox
 */
public class FuncionarioController {

    public FuncionarioController() {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        jpaController = (FuncionarioJpaController) facesContext.getApplication().getELResolver().getValue(facesContext.getELContext(), null, "funcionarioJpa");
        pagingInfo = new PagingInfo();
        converter = new FuncionarioConverter();
    }
    private Funcionario funcionario = null;
    private List<Funcionario> funcionarioItems = null;
    private FuncionarioJpaController jpaController = null;
    private FuncionarioConverter converter = null;
    private PagingInfo pagingInfo = null;

    public PagingInfo getPagingInfo() {
        if (pagingInfo.getItemCount() == -1) {
            pagingInfo.setItemCount(jpaController.getFuncionarioCount());
        }
        return pagingInfo;
    }

    public SelectItem[] getFuncionarioItemsAvailableSelectMany() {
        return JsfUtil.getSelectItems(jpaController.findFuncionarioEntities(), false);
    }

    public SelectItem[] getFuncionarioItemsAvailableSelectOne() {
        return JsfUtil.getSelectItems(jpaController.findFuncionarioEntities(), true);
    }

    public SelectItem[] getArrayNumDependentes() {
        List<SelectItem> arr = new ArrayList<SelectItem>();
        for (int i = 0; i < 11; i++) {
            arr.add(new SelectItem(new Integer(i), String.valueOf(i)));
        }
        return arr.toArray(new SelectItem[arr.size()]);
    }

    public Funcionario getFuncionario() {
        if (funcionario == null) {
            funcionario = (Funcionario) JsfUtil.getObjectFromRequestParameter("jsfcrud.currentFuncionario", converter, null);
        }
        if (funcionario == null) {
            funcionario = new Funcionario();
        }
        return funcionario;
    }

    public String listSetup() {
        reset(true);
        return "funcionario_list";
    }

    public String createSetup() {
        reset(false);
        funcionario = new Funcionario();
        return "funcionario_create";
    }

    public String create() {
        try {
            jpaController.create(funcionario);
            JsfUtil.addSuccessMessage("Funcionario was successfully created.");
        } catch (Exception e) {
            JsfUtil.ensureAddErrorMessage(e, "A persistence error occurred.");
            return null;
        }
        return listSetup();
    }

    public String detailSetup() {
        return scalarSetup("funcionario_detail");
    }

    public String editSetup() {
        return scalarSetup("funcionario_edit");
    }

    private String scalarSetup(String destination) {
        reset(false);
        funcionario = (Funcionario) JsfUtil.getObjectFromRequestParameter("jsfcrud.currentFuncionario", converter, null);
        if (funcionario == null) {
            String requestFuncionarioString = JsfUtil.getRequestParameter("jsfcrud.currentFuncionario");
            JsfUtil.addErrorMessage("The funcionario with id " + requestFuncionarioString + " no longer exists.");
            return relatedOrListOutcome();
        }
        return destination;
    }

    public String edit() {
        String funcionarioString = converter.getAsString(FacesContext.getCurrentInstance(), null, funcionario);
        String currentFuncionarioString = JsfUtil.getRequestParameter("jsfcrud.currentFuncionario");
        if (funcionarioString == null || funcionarioString.length() == 0 || !funcionarioString.equals(currentFuncionarioString)) {
            String outcome = editSetup();
            if ("funcionario_edit".equals(outcome)) {
                JsfUtil.addErrorMessage("Could not edit funcionario. Try again.");
            }
            return outcome;
        }
        try {
            jpaController.edit(funcionario);
            JsfUtil.addSuccessMessage("Funcionario was successfully updated.");
        } catch (IllegalOrphanException oe) {
            JsfUtil.addErrorMessages(oe.getMessages());
            return null;
        } catch (NonexistentEntityException ne) {
            JsfUtil.addErrorMessage(ne.getLocalizedMessage());
            return listSetup();
        } catch (Exception e) {
            JsfUtil.ensureAddErrorMessage(e, "A persistence error occurred.");
            return null;
        }
        return detailSetup();
    }

    public String destroy() {
        String idAsString = JsfUtil.getRequestParameter("jsfcrud.currentFuncionario");
        Integer id = new Integer(idAsString);
        try {
            jpaController.destroy(id);
            JsfUtil.addSuccessMessage("Funcionario was successfully deleted.");
        } catch (IllegalOrphanException oe) {
            JsfUtil.addErrorMessages(oe.getMessages());
            return null;
        } catch (NonexistentEntityException ne) {
            JsfUtil.addErrorMessage(ne.getLocalizedMessage());
            return relatedOrListOutcome();
        } catch (Exception e) {
            JsfUtil.ensureAddErrorMessage(e, "A persistence error occurred.");
            return null;
        }
        return relatedOrListOutcome();
    }

    private String relatedOrListOutcome() {
        String relatedControllerOutcome = relatedControllerOutcome();
        if (relatedControllerOutcome != null) {
            return relatedControllerOutcome;
        }
        return listSetup();
    }

    public List<Funcionario> getFuncionarioItems() {
        if (funcionarioItems == null) {
            getPagingInfo();
            funcionarioItems = jpaController.findFuncionarioEntities(pagingInfo.getBatchSize(), pagingInfo.getFirstItem());
        }
        return funcionarioItems;
    }

    public String next() {
        reset(false);
        getPagingInfo().nextPage();
        return "funcionario_list";
    }

    public String prev() {
        reset(false);
        getPagingInfo().previousPage();
        return "funcionario_list";
    }

    private String relatedControllerOutcome() {
        String relatedControllerString = JsfUtil.getRequestParameter("jsfcrud.relatedController");
        String relatedControllerTypeString = JsfUtil.getRequestParameter("jsfcrud.relatedControllerType");
        if (relatedControllerString != null && relatedControllerTypeString != null) {
            FacesContext context = FacesContext.getCurrentInstance();
            Object relatedController = context.getApplication().getELResolver().getValue(context.getELContext(), null, relatedControllerString);
            try {
                Class<?> relatedControllerType = Class.forName(relatedControllerTypeString);
                Method detailSetupMethod = relatedControllerType.getMethod("detailSetup");
                return (String) detailSetupMethod.invoke(relatedController);
            } catch (ClassNotFoundException e) {
                throw new FacesException(e);
            } catch (NoSuchMethodException e) {
                throw new FacesException(e);
            } catch (IllegalAccessException e) {
                throw new FacesException(e);
            } catch (InvocationTargetException e) {
                throw new FacesException(e);
            }
        }
        return null;
    }

    private void reset(boolean resetFirstItem) {
        funcionario = null;
        funcionarioItems = null;
        pagingInfo.setItemCount(-1);
        if (resetFirstItem) {
            pagingInfo.setFirstItem(0);
        }
    }

    public void validateCreate(FacesContext facesContext, UIComponent component, Object value) {
        Funcionario newFuncionario = new Funcionario();
        String newFuncionarioString = converter.getAsString(FacesContext.getCurrentInstance(), null, newFuncionario);
        String funcionarioString = converter.getAsString(FacesContext.getCurrentInstance(), null, funcionario);
        if (!newFuncionarioString.equals(funcionarioString)) {
            createSetup();
        }
    }

    public Converter getConverter() {
        return converter;
    }

    public int getFuncionarioDiaAdmissao() {
        Calendar cal = Calendar.getInstance();
        cal.setTime(funcionario.getDataAdmissao());
        return cal.get(Calendar.DAY_OF_MONTH);
    }

    public void setFuncionarioDiaAdmissao(int day) {
        funcionario.getDataAdmissao().setDate(day);
    }

    public int getFuncionarioMesAdmissao() {
        Calendar cal = Calendar.getInstance();
        cal.setTime(funcionario.getDataAdmissao());
        return cal.get(Calendar.MONTH) + 1;
    }

    public void setFuncionarioMesAdmissao(int mes) {
        funcionario.getDataAdmissao().setMonth(mes - 1);
    }

    public int getFuncionarioAnoAdmissao() {
        Calendar cal = Calendar.getInstance();
        cal.setTime(funcionario.getDataAdmissao());
        return cal.get(Calendar.YEAR);
    }

    public void setFuncionarioAnoAdmissao(int ano) {
        funcionario.getDataAdmissao().setYear(ano - 1900);
    }

    public int getFuncionarioDiaNascimento() {
        Calendar cal = Calendar.getInstance();
        cal.setTime(funcionario.getDataNascimento());
        return cal.get(Calendar.DAY_OF_MONTH);
    }

    public void setFuncionarioDiaNascimento(int day) {
        funcionario.getDataNascimento().setDate(day);
    }

    public int getFuncionarioMesNascimento() {
        Calendar cal = Calendar.getInstance();
        cal.setTime(funcionario.getDataNascimento());
        return cal.get(Calendar.MONTH) + 1;
    }

    public void setFuncionarioMesNascimento(int mes) {
        funcionario.getDataNascimento().setMonth(mes - 1);
    }

    public int getFuncionarioAnoNascimento() {
        Calendar cal = Calendar.getInstance();
        cal.setTime(funcionario.getDataNascimento());
        return cal.get(Calendar.YEAR);
    }

    public void setFuncionarioAnoNascimento(int ano) {
        funcionario.getDataNascimento().setYear(ano - 1900);
    }
}
